package com.qdlc.p2p.biz.service;

import java.util.List;

import com.qdlc.p2p.common.constant.RedEnvelopeType;
import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.*;
import com.qdlc.p2p.dal.model.UserRedEnvelopeModel;

/**
 * 用户红包获取记录Service接口
 *
 * @author ylx
 * @version 2.0
 * @date 2015年4月22日 下午3:45:39
 */
public interface UserRedEnvelopeService {
    /**
     * 保存用户红包
     *
     * @param userRedEnvelope
     * @return UserRedEnvelope
     */
    UserRedEnvelope save(UserRedEnvelope userRedEnvelope);

    /**
     * 分页查询用户红包记录
     *
     * @param model UserRedEnvelopeModel
     * @return PageDataList<UserRedEnvelopeModel>
     */
    PageDataList<UserRedEnvelopeModel> list(UserRedEnvelopeModel model);

    /**
     * 发放红包
     *
     * @param toUserId      红包获取用户ID
     * @param redEnvelopeId 红包方案ID
     * @param sourceType    红包来源
     * @return UserRedEnvelope
     */
    UserRedEnvelope giveRedEnvelope(long toUserId, long redEnvelopeId, String sourceType);

    /**
     * 修改用户红包
     *
     * @param userRedEnvelope 用户红包
     * @return UserRedEnvelope
     */
    UserRedEnvelope update(UserRedEnvelope userRedEnvelope);

    /**
     * 把用户红包置为无效
     *
     * @param id 用户红包主键ID
     */
    void doInvalid(long id);

    /**
     * 根据用户ID获取可使用红包列表
     *
     * @param userId 查询用户ID
     * @return List<UserRedEnvelope>
     */
    List<UserRedEnvelopeModel> useableList(long userId);

    /**
     * 根据用户ID获取可使用红包个数
     *
     * @param userId
     * @return 红包个数
     */
    int userableCount(long userId);

    /**
     * 根据ID获取选择使用红包的值
     *
     * @param ids    红包ID集合
     * @param toUserId 用户
     * @return 红包总额
     */
    double getTotalAmountByIds(long[] ids, long toUserId);

    /**
     * 根据用户和投标ID获取投标使用红包金额
     *
     * @param tenderId
     * @return 红包金额
     */
    double getTenderUseAmount(long tenderId);

    /**
     * 投资借款标冻结红包
     *
     * @param borrowTender   投标对象
     * @param redEnvelopeIds 红包id集合
     */
    void tenderBorrowFreezeRedEnvelope(BorrowTender borrowTender, long[] redEnvelopeIds);

    /**
     * 投资借款标使用红包
     *
     * @param tenderId 投标id
     */
    void tenderBorrowUseRedEnvelope(long tenderId);

    /**
     * 投资借款标失败红包还原
     *
     * @param borrowTender 投标对象
     */
    void tenderBorrowFailUseRedEnvelope(BorrowTender borrowTender);

    /**
     * 根据使用类型和外键ID获取红包总额
     *
     * @param useType 使用类型
     * @param keyId   外键ID
     * @return
     */
    double getTotalAmountByUseTypeANdKeyId(String useType, long keyId);

    /**
     * 购买债权转让使用红包
     *
     * @param bondTender     投标对象
     * @param redEnvelopeIds 红包id集合
     */
    void tenderBondUseRedEnvelope(BondTender bondTender, long[] redEnvelopeIds);

    /**
     * 购买债权转让失败红包还原
     *
     * @param bondTender 投标对象
     */
    void tenderBondFailUseRedEnvelope(BondTender bondTender);

    /**
     * 检测用户使用的红包状态
     *
     * @param redEnvelopeIds
     * @param user
     * @return
     */
    boolean checkRedEnvelope(long[] redEnvelopeIds, User user);

    /**
     * 根据状态查询对应 红包总额
     *
     * @param status
     * @return
     */
    double[] getUseRedEnvelopeSumByStatus(int status, String date);

    /**
     * 红包过期处理
     */
    void redEnvelopeExpireDispose();
}
